package com.yunpeng.aidevice.dao.service;

import com.yunpeng.aidevice.common.dto.save.UserSaveDTO;
import com.yunpeng.aidevice.common.vo.user.MerchantLoginUserVO;
import com.yunpeng.aidevice.dao.model.MerchantCountDO;
import com.yunpeng.aidevice.dao.model.entity.MerchantDO;
import com.yunpeng.aidevice.dao.model.entity.OrganizationDO;
import com.yunpeng.aidevice.dao.model.entity.UserDO;

import java.util.Date;
import java.util.List;

/**
 * IUserService 用户服务
 *
 * @author : Moore(hemw)
 * @date : 2020-04-08
 */
public interface IUserService {

    /**
     * 根据用户代码获取用户
     *
     * @param code         用户代码
     * @param merchantCode 商户代码
     * @param tenantCode   租户代码
     * @return
     */
    UserDO getByCode(String code, String merchantCode, String tenantCode);

    /**
     * 更新用户信息
     *
     * @param userSaveDTO  用户保存信息
     * @param operatorCode 操作人代码
     * @return
     */
    Boolean updateBasicInfo(UserSaveDTO userSaveDTO, String operatorCode);

    /**
     * 根据组织机构代码查询对应用户
     *
     * @param orgCode
     * @return
     */
    List<UserDO> queryListByOrganization(String orgCode);

    /**
     * 新增用户
     *
     * @param userSaveDTO  用户保存信息
     * @param operatorCode 操作用户代码
     * @return
     */
    Boolean addNewUser(UserSaveDTO userSaveDTO, String operatorCode);

    /**
     * 更新用户绑定组织
     *
     * @param userCodes      用户代码集合
     * @param organizationDO 组织机构信息
     * @param operatorCode   操作人代码
     * @return
     */
    Boolean userBindToOrganization(List<String> userCodes, OrganizationDO organizationDO, String operatorCode);


    /**
     * 统计权限关联用户数量
     *
     * @param permissionCode 二选一
     * @param userCode       二选一
     * @param now            当前时间
     * @return
     */
    Integer countPermissionRelation(String permissionCode, String userCode, Date now);

    /**
     * 根据用户编号获取用户对象
     *
     * @param number       用户编号
     * @param merchantCode 商户代码
     * @param tenantCode   租户代码
     * @return
     */
    UserDO getUserByNumber(String number, String merchantCode, String tenantCode);

    /**
     * 禁用启用用户
     *
     * @param enable       启用/禁用
     * @param userCode     用户代码
     * @param merchantCode 商户代码
     * @param tenantCode   租户代码
     * @param operatorCode 操作人代码
     * @return
     */
    Boolean enableOrDisableUser(Boolean enable, String userCode, String merchantCode, String tenantCode, String operatorCode);

    /**
     * 根据商户获取用户列表（2000）
     *
     * @param merchantCode
     * @param tenantCode
     * @return
     */
    List<UserDO> getUserByMerchant(String merchantCode, String tenantCode);

    /**
     * 获取设备关联的用户信息
     *
     * @param deviceCode
     * @return
     */
    List<UserDO> getDeviceRelationUsers(String deviceCode);

    /**
     * 统计商户用户数量
     *
     * @param merchantCodes
     * @param tenantCode
     * @param state
     * @return
     */
    List<MerchantCountDO> countByMerchant(List<String> merchantCodes, String tenantCode, String state);

    /**
     * 删除用户
     *
     * @param userCode
     * @param merchantCode
     * @param tenantCode
     * @return
     */
    Boolean removeUser(String userCode, String merchantCode, String tenantCode);

    /**
     * 创建商户默认用户
     *
     * @param merchantDO
     * @param operatorCode
     * @param orgCode
     * @return
     */
    Boolean addMerchantDefaultUser(MerchantDO merchantDO, String orgCode, String operatorCode);

    /**
     * 根据用户代码获取用户
     *
     * @param code 用户代码
     * @return
     */
    UserDO getByCode(String code);

    /**
     * 获取商户默认用户
     *
     * @param merchantCode
     * @param tenantCode
     * @return
     */
    UserDO getMerchantDefaultUser(String merchantCode, String tenantCode);

    /**
     * 修改密码
     *
     * @param userCode        用户代码
     * @param historyPassword 历史密码
     * @param password        新密码
     * @return
     */
    Boolean updatePassword(String userCode, String historyPassword, String password);

    /**
     * 重置密码
     *
     * @param userCode     用户代码
     * @param merchantCode 商户代码
     * @return
     */
    Boolean resetPassword(String userCode, String merchantCode);

    /**
     * 根据用户电话号码精确匹配商户信息(作为登录选择)
     *
     * @param phone
     * @return
     */
    List<MerchantLoginUserVO> getMerchantUserByPhone(String phone);
}
